Модуль:Languages
Модуль для работы с языками ISO 639 -- загрузка модуля данных с таблицей языков local languages = mw.loadData('Module:Languages/data') local p = {} -- Проверяет, пустой ли дан параметр local function isEmpty(s) return s nil or s '' end -- вспомогательная функция, удаляет пробелы local function trimstr(s) return (s:gsub("^%s*(.-)%s*$", "%1")) end -- получает код языка, возвращает ссылку и нормализованный код языка (или пустые строки) local function get_lang_data(code) local l = languagescode; if l ~= nil then return "[.. l[2 .. "|" .. l1 .. "]]", code elseif code ~= "" then return code, "" else return "", "" end end function p.getRefHtmlFrame( frame ) return p.getRefHtml( trimstr( frame.args1 ) ) end function p.getRefHtml( wikidataItemId ) local codeByItemId = mw.loadData( "Module:Wikidata/Language-codes" ) local code = codeByItemId[ wikidataItemId ]; if code nil then mw.log( 'Language code not found for ' .. wikidataItemId ) return "" else local l = languagescode; if l nil then mw.log( 'Language description for code ' .. code .. ' not found' ) return "" else return '(' .. l[ 1 ] .. ')' end end end -- принимает zh|我|tt|мин, возвращает название статьи из Module:Languages/data function p.name(frame) local code = trimstr( frame.args1 ) if code ~= nil and code ~= '' then return (languagescode and languagescode2 or ) end end -- принимает zh|我|tt|мин, возвращает список через запятую function p.list(frame) local curr_lang = nil local result = nil for n, v in frame:argumentPairs() do local trimmed = trimstr(v) if curr_lang nil then if trimmed ~= '' then -- если язык пропущен, оставим прошлый curr_lang = trimstr(v) end else if trimmed ~= '' then local link, lang_code = get_lang_data(curr_lang) local list_item if lang_code ~= '' then list_item = link .. " " .. trimmed .. "" else list_item = link .. " " .. trimmed .. "".."Category:Википедия:Статьи с нераспознанным языком" end if result nil then result = list_item else result = result .. ", " .. list_item end else -- Пустой текст — значит, текущий язык совпадает с следующим local link, lang_code = get_lang_data(curr_lang) if result nil then result = link else result = result .. ", " .. link end end curr_lang = nil end end -- просто #invoke:Languages|list|yue должно возвращать всё же ссылку без текста if curr_lang ~= nil then local link, lang_code = get_lang_data(curr_lang) if result ~= nil then result = result .. ", " .. link else result = link end end return result end -- Выводит название языка в предложном падеже function p.transform_lang(code) if isEmpty(languagescode) then return '<неизвестный код ' .. code .. '>' end if languagescode3 then return languagescode3 end local ln = mw.ustring.lower( languagescode and languagescode2 or mw.language.fetchLanguageName(code,'ru') ):gsub('%s+язык%s+', ' '):gsub('%s*%(?язык%)?%s*', '') if not ln then return 'языке с ISO-кодом '..code..' (?)' end if ln:match('.*лингва$') then return ln:gsub('а$','е') end if mw.ustring.match(ln,'сцкий$') or ln:match('ный$') or mw.ustring.match(ln,'сцкий%s%b()$') or ln:match('ный%s%b()$') then ln = mw.ustring.gsub( mw.ustring.gsub(ln, 'н(ыи)й(%A)', function(y,s) return (y 'ы' and 'ном' or 'нем')..s end) :gsub('ный$', 'ном'), '(сцк)ий(%A)', '%1ом%2' ):gsub('ский$', 'ском'):gsub('цкий$', 'цком'); if ln:match('%)$') and not (ln:match('ом%)$') or ln:match('нем%)$')) -- «языке» перед уточнением, если оно не склоняется then local r,s=ln:gsub('(%s)(%b())$','%1языке%1%2'); if s 1 then return r end end return ln..' языке' else return 'языке '..ln end end -- Проверяет существование страницы и является ли она перенаправлением local function getTitle(page) local success, result = pcall(function() local title = mw.title.new(page) return { title.exists, title.isRedirect } end) return success and result or nil end -- Выводит function p.getIW(frame) local mwlang = mw.getContentLanguage() local f = frame.args local title = f.title local text = f.text local lang = mwlang:lc(f.lang) local page = f.page local state = f.state local nocat = f.nocat -- Изображения для старой функции показа статуса local states = { 'ИС' = {'Википедия:Избранные статьи','Избранная статья','Small Skew Star SVG.svg'}, 'ХС' = {'Википедия:Хорошие статьи','Хорошая статья','Blue star unboxed.svg'}, 'ИСП' = {'Википедия:Избранные списки и порталы','Избранный список','Purple star unboxed.svg'} } -- Категории для шаблона local categoryErrors = 'Категория:Википедия:Статьи с некорректно заполненным шаблоном Не переведено' local categoryExists = 'Категория:Википедия:Статьи с неактуальным шаблоном Не переведено' local categoryRedirect = 'Категория:Википедия:Запросы на замену перенаправлений переводами' -- Проверяет существование параметров и заменяет их на альтернативные if isEmpty(text) then text = title end if isEmpty(lang) then lang = "en" end if isEmpty(page) then page = title end -- Создаёт шаблон if title ~= ' }' then local this = mw.title.getCurrentTitle() local titleObj = getTitle(title) local ifExists, ifRedirect local type = '' local s = '' local langName = '' if lang ~= 'd' then if isEmpty(languageslang) then if this.namespace 0 and isEmpty(nocat) then s = s .. categoryErrors end else langName = ' data-lang-name="' .. (languageslang1 and languageslang1 or '???') .. '"' end end -- Проверяет, не ограничен ли лимит вызовов функции if titleObj ~= nil then ifExists = titleObj1 ifRedirect = titleObj2 end -- Показывает ссылку на редирект или красную ссылку local class = (ifExists and (ifRedirect and ' iw--redirect' or ' iw--exists') or '') s = s .. string.format(, class, mwlang:ucfirst(title), lang) if ifRedirect then if this.namespace 0 and isEmpty(nocat) then s = s .. categoryRedirect end s = s .. string.format('%s', tostring(mw.uri.fullUrl(title,'redirect=no')), text) else s = s .. string.format('%s', title, text) end -- Показывает ссылку на иноязычную статью или предложение убрать шаблон if ifExists and not ifRedirect then s = s .. '' .. '?!' if this.namespace 0 and isEmpty(nocat) then s = s .. categoryExists end else -- Создаёт всплывающую подсказку local t = '' if lang 'd' then t = string.format('Страница статьи «%s» в Викиданных', mwlang:ucfirst(title)) page = page .. '#sitelinks-wikipedia' else if not isEmpty(f.page) then t = string.format('%s — версия статьи', page) else t = 'Версия статьи' end t = t .. string.format(' «%s» на %s', mwlang:ucfirst(title), p.transform_lang(lang)) end -- Создаёт примечание о перенаправлении local aster = '' if ifRedirect then aster = '' .. '' .. '*' .. '' end -- Выводит ссылку на иноязычную страницу s = s .. '' .. string.format('[%s]', lang, page, t, lang) .. aster -- Выводит статус иноязычной страницы if not isEmpty(state) and not isEmpty(statesstate) then s = s .. string.format('8px|link=%s|%s', statesstate3, statesstate1, statesstate2) end end return s .. '' else -- Если нет обязательного параметра, выводит красный текст local htmlerror = require('Module:Error').error return htmlerror{'Укажите название страницы.'} end end -- Раскрывает function p.unwrapIW(frame) local f = frame.args local title = f.title local text = f.text local s = '' .. text end return s .. '' end return p